home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software of the Month Club 2000 October
/
Software of the Month - Ultimate Collection Shareware 277.iso
/
pc
/
PROGRAMS
/
UTILITY
/
WINLINUX
/
DATA1.CAB
/
programs_-_usrdoc
/
PROCMAIL.{23
/
EXAMPLES
/
MAILSTAT
< prev
Wrap
Text File
|
1999-09-17
|
6KB
|
215 lines
#! /bin/sh
: &&O='cd .' || exec /bin/sh "$0" $argv:q # we're in a csh, feed myself to sh
$O || exec /bin/sh "$0" "$@" # we're in a buggy zsh
#################################################################
# mailstat shows mail-arrival statistics #
# #
# Parses a procmail-generated $LOGFILE and displays #
# a summary about the messages delivered to all folders #
# (total size, average size, nr of messages). #
# Exit code 0 if mail arrived, 1 if no mail arrived. #
# #
# For help try, "mailstat -h" #
# #
# Customise to your heart's content, this file is only #
# provided as a guideline. #
# #
# Created by S.R. van den Berg, The Netherlands #
# This file can be freely copied for any use. #
#################################################################
#$Id: mailstat,v 1.24.2.1 1999/04/06 03:35:03 guenther Exp $
# This shell script expects the following programs to be in the
# PATH (paths given here are the standard locations, your mileage
# may vary (if the programs can not be found, extend the PATH or
# put their absolute pathnames in here):
test=test # /bin/test
echo=echo # /bin/echo
expr=expr # /bin/expr
tty=tty # /bin/tty
sed=sed # /bin/sed
sort=sort # /bin/sort
awk=awk # /usr/bin/awk
cat=cat # /bin/cat
mv=mv # /bin/mv
ls=ls # /bin/ls
PATH=/bin:/usr/bin
SHELL=/bin/sh # just in case
export SHELL PATH
umask 077 # we don't allow everyone to read the tmpfiles
OLDSUFFIX=.old
DEVNULL=/dev/null
EX_USAGE=64
########
# (Concatenated) flags parsing in pure, portable, structured (it
# would have been more elegant if gotos were permitted) shellscript
# language. For added pleasure: a quick demonstration of the shell's
# quoting capabilities :-).
########
while $test $# != 0 -a a"$1" != a-- -a \
\( 0 != `$expr "X$1" : X-.` -o $# != 1 \)
do
if $expr "X$1" : X-. >$DEVNULL # structured-programming spaghetti
then
flags="$1"; shift
else
flags=-h # force help page
fi
while flags=`$expr "X$flags" : 'X.\(.*\)'`; $test ."$flags" != .
do
case "$flags" in
k*) MSkeeplogfile=1;;
l*) MSlong=1;;
m*) MSmergerror=1;;
o*) MSoldlog=1; MSkeeplogfile=1;;
t*) MSterse=1;;
s*) MSsilent=1;;
h*|\?*) $echo 'Usage: mailstat [-klmots] [logfile]' 1>&2
$echo ' -k keep logfile intact' 1>&2
$echo ' -l long display format' 1>&2
$echo ' -m merge any errors into one line' 1>&2
$echo ' -o use the old logfile' 1>&2
$echo ' -t terse display format' 1>&2
$echo ' -s silent in case of no mail' 1>&2
exit $EX_USAGE;;
*) $echo 'Usage: mailstat [-klmots] [logfile]' 1>&2; exit $EX_USAGE;;
esac
done
done
$test a"$1" = a-- && shift
LOGFILE="$1"
case "$LOGFILE" in
*$OLDSUFFIX) MSkeeplogfile=1; OLDLOGFILE="$LOGFILE";;
*) OLDLOGFILE="$LOGFILE$OLDSUFFIX";;
esac
if test .$MSoldlog = .1
then
LOGFILE="$OLDLOGFILE"
fi
if $test ."$LOGFILE" != .- -a ."$LOGFILE" != .
then
if $test ! -s "$LOGFILE"
then
if $test .$MSsilent = .
then
if $test -f "$LOGFILE" # split up the following nested backquote
then # expression, some shells (NET2) choked on it
info=`LANG= LC_TIME= $ls -l "$OLDLOGFILE"`
$echo No mail arrived since \
`$expr "X$info" : \
'.*[0-9] \(... .[^ ] .....\) [^ ]'`
else
$echo "Can't find your LOGFILE=$LOGFILE"
fi
fi
exit 1
fi
else
if $test ."$LOGFILE" != .- && $tty -s
then
$echo \
"Most people don't type their own logfiles; but, what do I care?" 1>&2
MSterse=1
fi
MSkeeplogfile=1; LOGFILE=
fi
if $test .$MSkeeplogfile = .
then $mv "$LOGFILE" "$OLDLOGFILE"; $cat $DEVNULL >>"$LOGFILE"
else OLDLOGFILE="$LOGFILE"
fi
if $test .$MSterse = .
then
if $test .$MSlong = .1
then
$echo ""
$echo " Total Average Number Folder"
$echo " ----- ------- ------ ------"
# We use MStrs here to place the spaces in columns that won't be
# converted to tabs by detab when this is checked into CVS
MStrs='" ----- ------- ------\n%7d %7d %7d\n",\
gtotal,gtotal/gmessages,gmessages'
else
$echo ""
$echo " Total Number Folder"
$echo " ----- ------ ------"
MStrs='" ----- ------\n%7d %7d\n",gtotal,gmessages'
fi
else
MStrs='""'
fi
if $test .$MSlong = .1
then MSlong='"%7d %7d %7d %s\n",total,total/messages,messages,folder'
else MSlong='"%7d %7d %s\n",total,messages,folder'
fi
TMPF=/tmp/maillog.$$
trap "rm -f $TMPF; exit 2" 1 2 3 13 15
trap "rm -f $TMPF; exit 0" 0
########
# And now we descend into the wonderful mix of shell-quoting and
# portable awk-programming :-)
########
rm -f $TMPF
$cat >$TMPF <<HERE
BEGIN {
FS="\\t";
}
{ if(folder!=\$1)
{ if(folder!="")
printf($MSlong);
gmessages+=messages;gtotal+=total;
messages=0;total=0;folder=\$1;
}
++messages;total+=\$2;
}
END {
if(folder!="")
printf($MSlong);
gmessages+=messages;gtotal+=total;
printf($MStrs);
}
HERE
########
# Only to end in a grand finale with your average sed script
########
if $test .$MSmergerror = .
then
$sed -e '/^From /d' -e '/^ [Ss][uU][bB][jJ][eE][cC][tT]:/d' \
-e '/^ Folder/s/ */ /' \
-e '/^ Folder/s/\/msg.[-0-9A-Za-z_][-0-9A-Za-z_]* /\/ /' \
-e '/^ Folder/s/\/[0-9][0-9]* /\/. /' \
-e 's/^ Folder: \(.*\)/\1/' -e t -e 's/ /\\t/g' \
-e 's/^/ ## /' $OLDLOGFILE | $sort | $awk -f $TMPF -
else
$sed -e '/^From /d' -e '/^ [Ss][uU][bB][jJ][eE][cC][tT]:/d' \
-e '/^ Folder/s/ */ /' \
-e '/^ Folder/s/\/msg.[-0-9A-Za-z_][-0-9A-Za-z_]* /\/ /' \
-e '/^ Folder/s/\/[0-9][0-9]* /\/. /' \
-e 's/^ Folder: \(.*\)/\1/' -e t \
-e 's/.*/ ## diagnostic messages ##/' $OLDLOGFILE | $sort | $awk -f $TMPF -
fi
########
# Nifty little script, isn't it?
# Now why didn't *you* come up with this truly trivial script? :-)
########